﻿// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include<iomanip>
#include<iostream>
#include"victory.h"
#include"three.h"
#include"four.h"
using namespace std;

char a[19][19];//棋盘
int playChessNumber=1;//下棋的有效次数
int x, y;//棋盘坐标


int Color()//判断棋子的颜色，即判断当前下子方
{
	if ((playChessNumber % 2 == 1) || a[x][y] == '#')//下棋的是黑子,i表示下棋的有效次数
		return 1;
	if ((playChessNumber % 2 == 0) || a[x][y] == '0')//下棋的是白子
		return 0;
	return 999;//异常返回
}
void getPoint()//获取下棋位置，并更新数组
{
	cout << "请输入下棋位置:";
	cin >> x >> y;//输入下棋位置
	x = x - 1;
	y = y - 1;
	if (a[x][y] == '+') {
		int m;
		m = Color();//判断棋子的颜色，即判断当前下子方,1为黑子，0为白子
		if (m == 1)
			a[x][y] = '#';//相应位置填充对应的棋子的信息
		if (m == 0)
			a[x][y] = '0';//相应位置填充对应的棋子的信息
		playChessNumber++;
	}
	else
	{
		cout << "请重新输入下棋位置！" << endl;
		getPoint();
	}
}
void Display()//输出数组，输出棋盘状态
{
	cout << endl;
	for (int i = 0;i < 19;i++)//每下一子输出一次数组
	{
		for (int j = 0;j < 19;j++)
		{
			cout <<setw(2)<< a[i][j];
		}
		cout << endl;
	}
}

bool judgeVictory(int &x, int &y)//判断胜利函数,返回1代表赢，返回0 代表非赢
{
	if (ns_victory(x, y) == true)//南北方向判胜
		return true;
	if (ew_victory(x, y) == true)//东西方向判胜
		return true;
	if (nw_se_victory(x, y) == true)//左斜方向判胜
		return true;
	if (ne_sw_victory(x, y) == true)//右斜方向判胜
		return true;
	return false;	
}

int activeThree(int &x, int &y)//判断活三，并返回活三个数
{
	int threeSum = 0;//活三数量
	if (ns_three(x, y) == true)//南北方向判断活三
		threeSum++;
	if (ew_three(x, y)== true)//东西方向判断活三
		threeSum++;
	if(nw_se_three(x,y)==true)//左斜方向判断活三
		threeSum++;
	if (ne_sw_three(x, y) == true)//右斜方向判断活三
		threeSum++;
	return threeSum;	
}
int activeFour(int &x, int &y)//判断活四或冲四，并返回个数
{
	int fourSum=0;//活四或冲四数量
	fourSum += ns_four(x, y);
	fourSum += ew_four(x, y);
	fourSum += nw_se_four(x, y);
	fourSum += ne_sw_four(x, y);
	return fourSum;
}
bool noHands(int &x, int &y)//判断禁手
{
	int threeNumber = 0;//活三的个数
	int fourNumber = 0;//活四或冲四的个数；
	threeNumber = activeThree( x, y);//活三的个数
	if (threeNumber >= 2)//禁手
		return true;
	fourNumber = activeFour(x, y);//活四或冲四的个数；
	if (fourNumber >= 2)//禁手
		return true;
	return false;//非禁手
}

int main()
{
	for (int i = 0;i < 19;i++)//初始化棋盘，用“+”代表空子的状态
	{
		for (int j = 0;j < 19;j++)
			a[i][j] = '+';
	}
	bool nohands = false;
	bool judgevictory = false;
	Display();
	while (!(judgevictory == true || nohands == true))
	{
		getPoint();
		Display();
		judgevictory = judgeVictory(x, y);
		if (judgevictory == true)
		{
			cout << a[x][y] << "棋胜利！" << endl;
			cout << "Game Over!" << endl;
		}
		if (a[x][y] == '#')
		{
			nohands = noHands(x, y);
			if (nohands == true)
			{
				cout << a[x][y] << "棋禁手，失败！" << endl;
				cout << "Game Over!" << endl;
			}
		}
	} 
		

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
